JERRY♎GITHUB

GO架构知识总结

一、GO基础

0. 程序,进程,线程,协程是什么

  • 程序 是一个静态的、保存在磁盘上的可执行文件,例如 .exe、.out 文件。它是代码 + 数据 + 资源的集合,但本身 还没有被执行,只是“潜力股”。
  • 进程 是程序运行起来的实例,是操作系统资源分配的最小单位。独立的内存空间
  • 线程 是操作系统调度的最小单位。一个进程可以有多个线程,它们 共享进程的内存资源(堆、全局变量),但每个线程有自己的栈空间。
  • 协程 是用户态的线程,也叫轻量级线程。它由程序自己调度,而不是操作系统调度。 协程之间切换开销小,不需要内核态切换,一个 G 初始只占几 KB 堆栈

1.GMP模型

  • G Goroutine 协程(数以百万计)-任务

  • M Machine 内核线程(OS Thread) -工人 (OS 线程)

  • P Processor 执行上下文(逻辑处理器)-工作台(任务队列)

  • golang调度器调度

  • 如果没有 G 可跑P 会去 全局队列或 别的 P 的队列偷任务(Work Stealing)

2. 垃圾回收-三色标记

  • 白色 未访问对象(可能是垃圾)

  • 灰色 已访问但字段未扫描的对象(待处理)

  • 黑色 已访问且字段也已扫描完的对象(活对象)

    • 1.初始化阶段: 所有对象都标为白色。

    • 2.根对象入灰: GC 从根对象(全局变量、栈上的变量等)开始,把它们标记为灰色,加入“灰色队列”。

    • 3.标记阶段:

    • 每次从灰色队列中取出一个对象:

      • 标为黑色
      • 把它引用的白色对象标为灰色,加入灰色队列
    • 直到灰色队列为空

    • 4.清除阶段:

    • 剩下白色的对象就是“不可达的垃圾”,回收掉。

    • 主要是找标记已引用的对象,清掉未引用的对象

3. channel

  • channel 是 Go 中的一种类型,用于在多个 goroutine 之间安全地传递数据,遵循 通信顺序一致性原则

4. sync.RwMutex

  • mu.RLock() 会给 mu 这个 sync.RWMutex 加“读锁”,表示当前有一个读操作正在进行。多个读锁之间是并发的,但一旦有写锁存在或等待,读锁必须等待。

5. sync.Cond,sync.Map,sync.Once

  • sync.Cond 条件变量,用于协程间的等待与通知
  • sync.Map 并发安全的 map
  • sync.Once 确保某段代码只执行一次,常用于 单例模式、惰性初始化、只调用一次的清理逻辑

二、分布式锁

  • 基于 Redis 的分布式锁(最常见)
  • 使用 etcd 实现分布式锁
  • 使用 ZooKeeper 的分布式锁 ZooKeeper 锁比较重型,Go 通常不首选。

三、分布式事务

  • DTM (Distributed Transaction Manager) 是 Go 语言开发的轻量级分布式事务框架,支持 TCC、SAGA、XA、消息事务。

  • TCC(Try-Confirm-Cancel) 业务自定义三阶段逻辑 强一致性 / 可控最终一致 中等 中高 ✅ 支持自定义回滚 金融、下单、扣库存等需预留资源的场景

  • SAGA 正向链式调用 + 补偿(无锁) 最终一致 中 高 ✅ 补偿函数(逆操作) 电商、流程审批、跨服务资源变更

  • 消息事务(事务消息) 本地事务 + MQ 消息(可靠发送) 最终一致 简单 高 ✅ 重试机制 异步事件通知、邮件发送、记账

  • XA(两阶段提交) 标准 2PC 协议,数据库驱动支持 强一致性 高 低 ✅ 自动回滚 银行、支付、主库一致性写入

  • 事务屏障(Barrier) 幂等 + 空补偿 + 防悬挂机制 辅助机制 辅助 中高 ✅ 多模型可用 防止接口幂等性问题、支持重复提交

  • alt text

四、Mysql相关

五、Redis相关

五、消息队列